#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
个人中心页面测试运行脚本
"""

import os
import sys
import time
import logging
import unittest
import pytest
from datetime import datetime
import traceback

# 添加项目根目录到Python路径
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

# 设置日志配置
def setup_logging():
    """设置日志配置"""
    # 创建日志目录
    log_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "logs")
    if not os.path.exists(log_dir):
        os.makedirs(log_dir)
        
    # 日志文件名包含时间戳
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    log_file = os.path.join(log_dir, f"profile_test_{timestamp}.log")
    
    # 配置日志
    logging.basicConfig(
        level=logging.DEBUG,
        format='%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s',
        handlers=[
            logging.FileHandler(log_file, encoding='utf-8'),
            logging.StreamHandler(sys.stdout)
        ]
    )
    
    logging.info(f"日志文件: {log_file}")
    return log_file

def run_tests():
    """运行个人中心页面测试"""
    try:
        # 设置日志
        log_file = setup_logging()
        
        logging.info("=" * 50)
        logging.info("开始运行个人中心页面测试")
        logging.info("=" * 50)
        
        # 导入测试用例
        from tests.test_cases.test_profile import TestProfile
        
        # 创建测试套件
        suite = unittest.TestLoader().loadTestsFromTestCase(TestProfile)
        
        # 运行测试
        result = unittest.TextTestRunner(verbosity=2).run(suite)
        
        # 输出测试结果
        logging.info("=" * 50)
        logging.info(f"测试完成: 运行 {result.testsRun} 个测试")
        logging.info(f"成功: {result.testsRun - len(result.errors) - len(result.failures)}")
        logging.info(f"失败: {len(result.failures)}")
        logging.info(f"错误: {len(result.errors)}")
        logging.info("=" * 50)
        
        # 输出失败和错误详情
        if result.failures:
            logging.error("失败的测试:")
            for test, error in result.failures:
                logging.error(f"- {test}")
                logging.error(f"  {error}")
        
        if result.errors:
            logging.error("错误的测试:")
            for test, error in result.errors:
                logging.error(f"- {test}")
                logging.error(f"  {error}")
        
        logging.info(f"详细日志请查看: {log_file}")
        
        # 返回测试结果
        return len(result.failures) == 0 and len(result.errors) == 0
        
    except Exception as e:
        logging.error(f"运行测试时发生异常: {e}")
        logging.error(traceback.format_exc())
        return False

if __name__ == "__main__":
    try:
        # 记录开始时间
        start_time = time.time()
        
        # 运行测试
        success = run_tests()
        
        # 计算运行时间
        end_time = time.time()
        duration = end_time - start_time
        
        # 输出总结
        logging.info(f"测试运行时间: {duration:.2f} 秒")
        
        # 设置退出代码
        sys.exit(0 if success else 1)
        
    except KeyboardInterrupt:
        logging.warning("测试被用户中断")
        sys.exit(130)
    except Exception as e:
        logging.critical(f"测试框架发生严重错误: {e}")
        logging.critical(traceback.format_exc())
        sys.exit(2) 
# 设置项目根目录到系统路径
ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(ROOT_DIR)

# 配置日志
from tests.utilities.logger import setup_logger
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
setup_logger()

# 确保配置文件中的BASE_URL正确
import tests.config.config as config
# 设置BASE_URL - 确保使用正确的基础URL
config.BASE_URL = "http://localhost:8080"

# 设置WebDriver等待时间，增加等待时间以适应页面加载
config.IMPLICIT_WAIT = 20
config.EXPLICIT_WAIT = 30

def run_profile_tests():
    """运行个人中心功能测试"""
    logging.info("开始运行个人中心功能测试...")
    logging.info(f"使用BASE_URL: {config.BASE_URL}")
    logging.info(f"个人中心页面URL: {config.BASE_URL}/back/user/person")
    logging.info(f"隐式等待时间: {config.IMPLICIT_WAIT}秒")
    logging.info(f"显式等待时间: {config.EXPLICIT_WAIT}秒")
    
    # 创建截图目录
    screenshots_dir = os.path.join(ROOT_DIR, "screenshots")
    os.makedirs(screenshots_dir, exist_ok=True)
    logging.info(f"截图将保存在: {screenshots_dir}")
    
    # 创建报告目录
    report_dir = os.path.join(ROOT_DIR, "tests", "reports")
    os.makedirs(report_dir, exist_ok=True)
    
    # 设置报告文件路径
    report_file = os.path.join(report_dir, f"profile_test_report_{timestamp}.html")
    
    # 运行测试
    pytest_args = [
        "-v",                          # 详细输出
        "--html=" + report_file,       # HTML报告
        "--self-contained-html",       # 自包含HTML报告
        "--capture=tee-sys",           # 捕获输出
        "--log-cli-level=INFO",        # 控制台日志级别
        os.path.join(ROOT_DIR, "tests", "test_cases", "test_profile.py")
    ]
    
    result = pytest.main(pytest_args)
    
    # 输出测试结果
    if result == 0:
        logging.info("所有个人中心测试用例通过！")
        print(f"所有个人中心测试用例通过！详细报告请查看: {report_file}")
    else:
        logging.error("部分个人中心测试用例失败！")
        print(f"部分个人中心测试用例失败！详细报告请查看: {report_file}")
        print(f"请查看截图目录 {screenshots_dir} 获取更多信息")
    
    return result

def run_profile_tests_debug():
    """以调试模式运行个人中心功能测试"""
    logging.info("以调试模式运行个人中心功能测试...")
    
    # 设置更长的等待时间
    config.IMPLICIT_WAIT = 30
    config.EXPLICIT_WAIT = 45
    
    # 创建截图目录
    screenshots_dir = os.path.join(ROOT_DIR, "screenshots", "debug_" + timestamp)
    os.makedirs(screenshots_dir, exist_ok=True)
    logging.info(f"调试截图将保存在: {screenshots_dir}")
    
    # 设置环境变量，指示测试在调试模式下运行
    os.environ["TEST_DEBUG_MODE"] = "true"
    os.environ["SCREENSHOTS_DIR"] = screenshots_dir
    
    # 运行测试
    pytest_args = [
        "-v",                          # 详细输出
        "--no-header",                 # 不显示头信息
        "--no-summary",                # 不显示摘要
        "--showlocals",                # 显示局部变量
        "--capture=tee-sys",           # 捕获输出
        "--log-cli-level=DEBUG",       # 控制台日志级别为DEBUG
        "-s",                          # 不捕获标准输出
        os.path.join(ROOT_DIR, "tests", "test_cases", "test_profile.py")
    ]
    
    result = pytest.main(pytest_args)
    
    # 清除环境变量
    os.environ.pop("TEST_DEBUG_MODE", None)
    os.environ.pop("SCREENSHOTS_DIR", None)
    
    return result

if __name__ == "__main__":
    # 检查是否以调试模式运行
    if len(sys.argv) > 1 and sys.argv[1] == "--debug":
        run_profile_tests_debug()
    else:
        run_profile_tests() 